#!/bin/bash
# Spring Boot 服务管理脚本（支持启动/停止/重启/状态查看）
# 配置项（根据实际情况修改）
APP_NAME="haircut-0.0.1-SNAPSHOT.jar"  # Jar包文件名（请替换为你的Jar包名）
APP_PATH=$(cd $(dirname $0); pwd)  # 脚本所在目录（自动获取）
JAR_FILE="${APP_PATH}/${APP_NAME}"  # Jar包完整路径
LOG_FILE="${APP_PATH}/app.log"      # 日志文件路径
ENV_PROFILE="dev"                  # 环境（默认dev）

# 检查Jar包是否存在
if [ ! -f "${JAR_FILE}" ]; then
    echo "错误：Jar包 ${JAR_FILE} 不存在，请检查路径！"
    exit 1
fi

# 获取进程ID
get_pid() {
    # 查找包含Jar包名的进程（排除grep自身）
    echo $(ps -ef | grep "${JAR_FILE}" | grep -v grep | awk '{print $2}')
}

# 启动服务
start() {
    pid=$(get_pid)
    if [ -n "${pid}" ]; then
        echo "服务已在运行中，进程ID:${pid}"
        return 0
    fi

    # 启动命令（指定dev环境，日志输出到文件）
    echo "启动服务（环境：${ENV_PROFILE}）..."
    nohup java -jar "${JAR_FILE}" --spring.profiles.active="${ENV_PROFILE}" > "${LOG_FILE}" 2>&1 &

    # 等待3秒后检查是否启动成功
    sleep 3
    pid=$(get_pid)
    if [ -n "${pid}" ]; then
        echo "服务启动成功，进程ID:${pid}，日志文件：${LOG_FILE}"
    else
        echo "服务启动失败，请查看日志：${LOG_FILE}"
    fi
}

# 停止服务
stop() {
    pid=$(get_pid)
    if [ -z "${pid}" ]; then
        echo "服务未在运行"
        return 0
    fi

    # 尝试优雅停止（15秒超时）
    echo "停止服务（进程ID：${pid}）..."
    kill "${pid}"

    # 等待进程终止
    count=0
    while [ ${count} -lt 15 ]; do
        pid=$(get_pid)
        if [ -z "${pid}" ]; then
            echo "服务已停止"
            return 0
        fi
        sleep 1
        count=$((count + 1))
    done

    # 超时强制停止
    echo "停止超时，强制终止服务..."
    kill -9 "${pid}"
    pid=$(get_pid)
    if [ -z "${pid}" ]; then
        echo "服务已强制停止"
    else
        echo "服务停止失败，请手动检查"
    fi
}

# 重启服务
restart() {
    stop
    start
}

# 查看服务状态
status() {
    pid=$(get_pid)
    if [ -n "${pid}" ]; then
        echo "服务正在运行，进程ID：${pid}"
    else
        echo "服务未运行"
    fi
}

# 命令参数处理
case "$1" in
    "start")
        start
        ;;
    "stop")
        stop
        ;;
    "restart")
        restart
        ;;
    "status")
        status
        ;;
    *)
        echo "使用方法：$0 {start|stop|restart|status}"
        echo "  start   - 启动服务（默认dev环境）"
        echo "  stop    - 停止服务"
        echo "  restart - 重启服务"
        echo "  status  - 查看服务状态"
        exit 1
        ;;
esac